package com.solution.admin.product.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.solution.admin.product.constants.ProductConstants;
import com.solution.admin.product.dao.ProductPropertyDao;
import com.solution.admin.product.entity.ProductPropertyEntity;
import com.solution.admin.product.service.ProductPropertyService;
import com.solution.common.dao.BaseDao;
import com.solution.common.page.PageBean;
import com.solution.common.page.PageParam;
import com.solution.common.service.impl.BaseServiceImpl;
import com.solution.common.utils.string.StringUtil;

/**
 * 商品属性service实现层
 * 
 * @author lilp
 * @date 2017-08-30 19:01:10
 */
@Service
public class ProductPropertyServiceImpl extends
		BaseServiceImpl<ProductPropertyEntity> implements
		ProductPropertyService {

	/**
	 * 商品属性接口
	 */
	@Autowired
	private ProductPropertyDao productPropertyDao;

	protected BaseDao<ProductPropertyEntity> getDao() {
		return this.productPropertyDao;
	}

	/**
	 * 保存商品属性
	 * 
	 * @param productPropertyEntity
	 *            商品属性实体
	 * @return Long 添加成功商品属性的ID
	 * @author lilp
	 * @date 2017-08-30 19:01:10
	 */
	@Transactional(propagation=Propagation.REQUIRED,rollbackFor=Exception.class)
	public long saveProductProperty(ProductPropertyEntity productPropertyEntity) {
		return productPropertyDao.saveProductProperty(productPropertyEntity);
	}

	/**
	 * 分页查询商品属性
	 * 
	 * @param pageParam
	 *            分页参数
	 * @param paramMap
	 *            查询参数
	 * @return PageBean 分页参数和分页数据
	 * @author lilp
	 * @date 2017-08-30 19:01:10
	 */
	@Override
	public PageBean listProductPropertyPage(PageParam pageParam,
			Map<String, Object> paramMap) {
		return productPropertyDao.listProductPropertyPage(pageParam, paramMap);
	}
	
	
	/**
	 * 分页查询商品属性列表 ( 其中排除指定商品属性模板中已有的属性 )
	 * @param pageParam
	 * @param paramMap
	 * @return
	 */
	@Override
	public PageBean listProductPropertyPageForTemplate(PageParam pageParam,Map<String, Object> paramMap){
		return productPropertyDao.listProductPropertyPageForTemplate(pageParam, paramMap);
	}

	/**
	 * 根据ID查询用户信息
	 * 
	 * @param id
	 *            用户id
	 * @return productPropertyEntity 用户对象
	 * @author lilp
	 * @date 2017-08-30 19:01:10
	 */
	public ProductPropertyEntity getProductPropertyById(Long id) {
		return productPropertyDao.getById(id.longValue());
	}

	/**
	 * 更新用户
	 * 
	 * @param productPropertyEntity
	 *            用户实体
	 * @return Long 更新是否成功，>1代表更新成功
	 * @author lilp
	 * @date 2017-08-30 19:01:10
	 */
	@Override
	public int updateProductProperty(ProductPropertyEntity productPropertyEntity) {
		int result = productPropertyDao.updateProductProperty(productPropertyEntity);
		//同步修改的数据到商品分类搜索筛选项表
		if (result > 0 && StringUtil.isNotEmpty(productPropertyEntity.getPropertyName())) {
			Map<String, Object> paramMap = new HashMap<String, Object>();
			paramMap.put("propertyName", productPropertyEntity.getPropertyName());
			productPropertyDao.updateToProductCategoryPropertyFilter(paramMap);
		}
		return result;
	}

	/**
	 * 根据条件查询商品属性
	 * 
	 * @param param
	 * @return 数据列表
	 * @author lilp
	 * @date 2017-08-30 19:01:10
	 */
	@Override
	public List<ProductPropertyEntity> listProductProperty(
			Map<String, Object> param) {
		return productPropertyDao.listProductProperty(param);
	}

	/**
	 * 删除商品属性
	 * 
	 * @param
	 * @return int 返回删除记录条数
	 * @author lilp
	 * @date 2017-08-30 19:01:10
	 */
	@Override
	public int deleteProductPropertyById(long id) {
		return productPropertyDao.deleteById(id);
	}

	/**
	 * 修改商品属性排序值
	 * 
	 * @param id
	 * @param direction
	 * @return
	 */
	@Override
	@Transactional(rollbackFor=Exception.class)
	public int updateProductPropertySort(String id, String direction, String sortNo) {
		// 查询离本条记录最近的，最大值排序值和记录；两条记录交换sort_no 字段的值
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("id", id);
		param.put("direction", direction);
		param.put("sortNo", sortNo);
		// ppeList 中返回两条记录，第1条待排序记录； 第2条 sort_no小于第1条记录的最近一条记录
		List<ProductPropertyEntity> ppeList = productPropertyDao.listProductPropertyForSort(param);
		
		if(ppeList != null && ppeList.size() == 1){
			// 如果返回1条记录，说明是最后一条（无法下移），或第一条（无法上移）,无需修改顺序
			return 1;
		}
		// 如果找到两条记录，说明是已经找到相邻的两条记录，交换顺序号即可
		if(ppeList != null && ppeList.size()>0){
			ProductPropertyEntity firstEntity = ppeList.get(0);
			ProductPropertyEntity secondEntity = ppeList.get(1);
			if(ProductConstants.SORT_DIRECTION.TOP.getId().equals(direction)){
				// 置顶操作
				int tmpSortNo = firstEntity.getSortNo();
				secondEntity.setSortNo(tmpSortNo-1);
				int result = productPropertyDao.updateProductPropertySort(secondEntity);
				return result;
			}else{
				// 上移 或 下移
				int tmpSortNo = firstEntity.getSortNo();
				firstEntity.setSortNo(secondEntity.getSortNo());
				secondEntity.setSortNo(tmpSortNo);
				int firstResult = productPropertyDao.updateProductPropertySort(firstEntity);
				int secondResult = productPropertyDao.updateProductPropertySort(secondEntity);
				if((firstResult+secondResult)==2){
					return 1;
				}else{
					return 0;
				}
			}
		}
		return 1;
	}
	
	
	/**
	 * 查询商品属性模板-属性列表
	 * @param param
	 * @return
	 */
	@Override
	public List<ProductPropertyEntity> listPropductPropertyTemplatePropertyList(Map<String, Object> param){
		return productPropertyDao.listPropductPropertyTemplatePropertyList(param);
	}

    /**
     * 根据商品ID获取属性列表（用于不使用模板）
     * 
     * @param productId
     * @return List<ProductPropertyEntity>
     * @author xu_cc
     * @throws Exception
     *             exception
     * @Date 创建时间：2017年11月7日 上午9:23:08
     */
    public List<ProductPropertyEntity> listByProductId(Long productId) {
        return productPropertyDao.listByProductId(productId);
    }
}
